package Day_0226.BuilderPattern;

/**
 * @author zxc
 * @date 2023/02/26 22:09
 **/
public class BuilderPattern {
    public static void main(String[] args) {
        /**
         * 谈一谈对于 建造者模式的理解
         * ===》
         * 1.建造者模式的概念
         * ===》
         * （1）建造者模式：
         *  是将一个复杂的对象的构建与它的表示分离，使得同样的构建过程可以创建不同的方式进行创建。
         * （2）工厂类模式是提供的是创建单个类的产品
         * （3）而建造者模式则是将各种产品集中起来进行管理，用来管理具有不同属性的产品
         *
         * 2.建造者模式通常包括 ：
         * 1）builder ：
         * （1）给出一个抽象接口，以规范产品对象的各个组成成分的建造。
         * （2）这个接口规定要实现复杂对象的哪些部分的创建，并不涉及具体的对象部件的创建。
         *
         * 2）ConcreteBuilder ：
         * 实现Builder接口，针对不同的商业逻辑，具体化复杂对象的各部分的创建。
         * 在建造过程完成后，提供产品的实例。
         *
         * 3）Director ：
         * 调用具体建造者来创建复杂对象的各个部分，在指导者中不涉及具体产品的信息，只负责保证对象各部分完整创建或按某种顺序创建。
         *
         * 4）Product ：
         * 要创建的复杂对象。
         *
         * 3.建造者模式的使用场景
         * ===》
         * 使用场景：
         * 1）需要生成的对象具有复杂的内部结构。
         * 2）需要生成的对象内部属性本身相互依赖。
         * （1）与工厂模式的区别是：建造者模式更加关注与零件装配的顺序。
         * （2）JAVA 中的 StringBuilder就是建造者模式创建的，他把一个单个字符的char数组组合起来
         * （3）Spring不是建造者模式，它提供的操作应该是对于字符串本身的一些操作，而不是创建或改变一个字符串。
         *
         * ===》
         * 总结 ：
         * （1）建造者模式，主要适用于 具有多个不同属性的复杂对象;
         *  即，将对象的属性赋值 交由不同实现类来进行操作;
         * （2）首先，创建一个 接口 Builder，用来规定 所赋予该类对象属性的所有可能方法;
         * （3）其次，创建一个 继承该接口Builder的实现类，代表了对于Builder接口中所定义的赋予属性方法的具体实现;
         *  ===》
         *  不同实现类，对于Builder接口中所定义的赋予属性方法的具体实现是不一样的;
         * （4）最后，创建一个 Director，来指定所要调用的具体实现类;
         *  同时调用该具体实现类中的方法，来对于该复杂对象的属性进行赋值 && 获取该复杂对象实例;
         *
         */
    }
}
//装备类
class Arms {
    //头盔
    private String helmet;
    //铠甲
    private String armor;
    //武器
    private String weapon;

    public void setHelmet(String helmet) {
        this.helmet = helmet;
    }

    public void setArmor(String armor) {
        this.armor = armor;
    }

    public void setWeapon(String weapon) {
        this.weapon = weapon;
    }

    public String getArmor() {
        return armor;
    }

    public String getHelmet() {
        return helmet;
    }

    public String getWeapon() {
        return weapon;
    }
}
// 1.定义抽象接口，来规范该 该复杂对象中各个组件的创建;
// 注意 ：该Builder接口，仅仅只是定义了对象中所要创建组件的规范;
interface PersonBuilder {
    void builderHelmetMurder();
    void builderArmorMurder();
    void builderWeaponMurder();
    void builderHelmetYanLong();
    void builderArmorYanLong();
    void builderWeaponYanLong();
    Arms BuilderArms(); //组装
}
// 2.创建Builder实现类，来对于 Builder接口中所定义的方法进行实现;
class ArmsBuilder implements PersonBuilder {
    private Arms arms;
    //创建一个Arms实例,用于调用set方法
    public ArmsBuilder() {
        arms = new Arms();
    }
    public void builderHelmetMurder() {
        arms.setHelmet("夺命头盔");
    }
    public void builderArmorMurder() {
        arms.setArmor("夺命铠甲");
    }
    public void builderWeaponMurder() {
        arms.setWeapon("夺命宝刀");
    }
    public void builderHelmetYanLong() {
        arms.setHelmet("炎龙头盔");
    }
    public void builderArmorYanLong() {
        arms.setArmor("炎龙铠甲");
    }
    public void builderWeaponYanLong() {
        arms.setWeapon("炎龙宝刀");
    }
    // 返回已经赋予属性的对象实例;
    public Arms BuilderArms() {
        return arms;
    }
}
// 3.Director
// ===》调用具体建造者，来创建复杂对象的各个部分，在指导者中不涉及具体产品的信息，只负责保证对象各部分完整创建或按某种顺序创建。
class PersonDirector {
    // 调用具体建造者，来实现对于复杂对象中各个部分的创建;
    public Arms constructPerson(PersonBuilder pb) {
        pb.builderHelmetYanLong();
        pb.builderArmorMurder();
        pb.builderWeaponMurder();
        pb.builderHelmetMurder();
        return pb.BuilderArms();
    }
    public static void main(String[] args) {
        PersonDirector pb = new PersonDirector();
        Arms arms = pb.constructPerson(new ArmsBuilder());
        System.out.println(arms.getHelmet());
        System.out.println(arms.getArmor());
        System.out.println(arms.getWeapon());
    }
}
